package hr.ctg.domain.action.zupanija;

import hr.ctg.domain.model.Mjesto;
import hr.ctg.domain.model.Objekt;
import hr.ctg.domain.model.Otok;
import hr.ctg.domain.model.TipObjekta;
import hr.ctg.domain.model.Zupanija;
import hr.ctg.domain.model.Rola.Role;
import hr.ctg.service.dao.MjestoDAO;
import hr.ctg.service.dao.ObjektDAO;
import hr.ctg.service.dao.OtokDAO;
import hr.ctg.service.dao.TipObjektaDAO;
import hr.ctg.service.dao.ZupanijaDAO;
import hr.web.jsf.model.PagedListDataModel;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.faces.context.FacesContext;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.security.Identity;

@Name("zupanijaDetailsAction")
@Scope(ScopeType.CONVERSATION)
public class ZupanijaDetailsAction {
	@In
	ZupanijaDAO zupanijaDAO;
	@In
	MjestoDAO mjestoDAO;
	@In
	OtokDAO otokDAO;
	@In
	ObjektDAO objektDAO;
	@In
	TipObjektaDAO tipObjektaDAO;
	@In
	Identity identity;
	@In
	String currentLang;

	@RequestParameter
	Integer idZupanije;
	@RequestParameter
	Integer idTipaObjekta;
	@RequestParameter
	private Integer page;

	@In
	FacesContext facesContext;

	@Factory("zupanijaDetails")
	public Zupanija getZupanija() {
		return zupanijaDAO.find(idZupanije);
	}

	public boolean hasTopMjesta(final Integer idTipaObjekta) {
		if (mjestoDAO.findCountTopByOcjenaIdTipaObjektaIdZupanije(idZupanije,
				idTipaObjekta) == 0) {
			return mjestoDAO
					.findCountTopByPosjetObjektaIdTipaObjektaIdZupanije(
							idZupanije, idTipaObjekta) == 0 ? false : true;
		} else {
			return true;
		}
	}

	@Factory("mjestaByZupanija")
	public javax.faces.model.DataModel getMjesta() {
		List<Mjesto> tmpList = null;
		Integer totalResultsCount = 0;
		if (page == null) {
			page = 1;
		}
		if (identity.hasRole(Role.ADMIN.toString())) {
			tmpList= mjestoDAO.findByIdZupanije(idZupanije,page * 15 - 15, 15);
			totalResultsCount = mjestoDAO.countByIdZupanije(idZupanije).intValue();
		} else {
			tmpList= mjestoDAO.findByOOOIdZupanijeJezik(idZupanije, currentLang, page * 15 - 15, 15);
			totalResultsCount = mjestoDAO.findCountByOOOIdZupanijeJezik(idZupanije, currentLang);
		}
		return new PagedListDataModel(tmpList,totalResultsCount , 15);
	}
	
	@Factory("allMjestaByZupanija")
	public List<Mjesto> getMjestaByZupanija() {
		List<Mjesto> tmpList = null;
		tmpList= mjestoDAO.findByIdZupanije(idZupanije);
		return tmpList;
	}

	@Factory("otociByZupanija")
	public List<Otok> getOtoci() {
		if (identity.hasRole(Role.ADMIN.toString())) {
			return otokDAO.findByIdZupanije(idZupanije);
		} else {
			return otokDAO.findByOOOIdZupanijeJezik(idZupanije, currentLang);
		}
	}

	@Factory("tipoviObjekataByZupanija")
	public List<TipObjekta> getTipoviObjekata() {
		final Zupanija zupanija = getZupanija();
		if (zupanija != null) {
			return tipObjektaDAO.findByIdZupanije(Integer.valueOf(zupanija
					.getIdZupanje()));
		}

		return null;
	}

	public boolean hasTopObjekti() {
		return objektDAO.findCountByOcjenaBrojPosjetaIdZupanije(idZupanije) > 0L;
	}

	@SuppressWarnings("unchecked")
	@Factory("objektiByZupanija")
	@Begin(join = true)
	public List<Objekt> getObjekti() {
		if (idZupanije == null || idTipaObjekta == null) {
			return Collections.EMPTY_LIST;
		}
		final List<Objekt> l = objektDAO.findByIdZupanijeIdTipaObjekta(
				idZupanije, idTipaObjekta);
		List projections = objektDAO.findOBDBSByIdObjektaList(l);
		if (l.size() > 0) {
			for (final Objekt objekt : l) {
				for (final Iterator<Object[]> localIterator2 = projections
						.iterator(); localIterator2.hasNext();) {
					final Object[] proj = localIterator2.next();
					if (proj[0].equals(objekt.getIdObjekta())) {
						objekt.setOcjena((Double) proj[1]);
						objekt.setBrojDojmova((Integer) proj[2]);
						objekt.setBrojSlika((Integer) proj[3]);
					}
				}
			}
		}
		return l;
	}

}
